package logging

import (
	"fmt"
	"os"
	"sync"
)

// FileBackend 文件后端
type FileBackend struct {
	FileName string    // 文件名
	FileFlag int       // 文件标志
	Channel  string    // 通道
	filters  []Filter  // 过滤器
	file     *os.File  // 文件句柄
	cfOnce   sync.Once // 文件创建处理
}

// Write 写入数据
func (backend *FileBackend) Write(b []byte) (int, error) {
	if backend.file == nil {
		backend.cfOnce.Do(backend.createMissingFile)
	}
	return backend.file.Write(b)
}

// AddFilter 添加过滤器
func (backend *FileBackend) AddFilter(filter Filter) {
	backend.filters = append(backend.filters, filter)
}

// Filter 过滤消息
func (backend *FileBackend) Filter(rec *Record) bool {
	for _, f := range backend.filters {
		if !f.Filter(rec) {
			return false
		}
	}
	return true
}

// Close 关闭后端
func (backend *FileBackend) Close() {
	if backend.file != nil {
		_ = backend.file.Close()
		backend.file = nil
	}
}

// createMissingFile 创建缺失的日志文件
func (backend *FileBackend) createMissingFile() {
	filename := fmt.Sprintf("%s/%s", GetCore().logDir, backend.FileName)
	f, err := os.OpenFile(filename,
		os.O_RDWR|os.O_CREATE|backend.FileFlag, os.ModePerm.Perm())
	if err != nil {
		panic(fmt.Sprintf("创建日志文件失败: %v, %v", filename, err))
	}
	backend.file = f
}
